package modifyx

import (
	"gitee.com/zhongguo168a/gocodes/datax/convertx"
	"strconv"
)

func newArray() (obj *Array) {
	obj = &Array{
		temps: map[int]interface{}{},
	}
	return
}

// 修正对象
// 如果需要在运行时，替换源的数据，可通过设置runtime实现
type Array struct {
	root *Root
	// 字段的路径
	path string
	// 在父对象中的字段名字
	field string
	// 缓存的map/array/struct等对象, 避免重复创建对象
	temps map[int]interface{}
	//
	creator func(obj IObject) IObject
}

func (s *Array) Dispose() {
	s.temps = nil
	s.root = nil
}

func (s *Array) RefOriginBool(index int) bool {
	root := s.root
	return convertx.AnyToBool(root.source.GetOrigin(s.path + "/" + strconv.Itoa(index)))
}

func (s *Array) RefOriginFloat(index int) float64 {
	root := s.root
	return convertx.AnyToFloat64(root.source.GetOrigin(s.path + "/" + strconv.Itoa(index)))
}
func (s *Array) RefOriginInt(index int) int {
	root := s.root
	return convertx.AnyToInt(root.source.GetOrigin(s.path + "/" + strconv.Itoa(index)))
}

// 修正后的整型
func (s *Array) RefInt(index int) int {
	root := s.root
	return convertx.AnyToInt(root.source.Get(s.root.ctx, s.path+"/"+strconv.Itoa(index)))
}

func (s *Array) RefUint(index int) (val uint) {
	return uint(s.RefInt(index))
}

// 修正后的整型
func (s *Array) RefBool(index int) bool {
	root := s.root
	return convertx.AnyToBool(root.source.Get(s.root.ctx, s.path+"/"+strconv.Itoa(index)))
}

// 修正后的浮点型
func (s *Array) RefFloat64(index int) float64 {
	root := s.root
	return convertx.AnyToFloat64(root.source.Get(s.root.ctx, s.path+"/"+strconv.Itoa(index)))

}

// 获取原始数据指定的字段
func (s *Array) RefOrigin(index int) interface{} {
	return s.root.source.GetOrigin(strconv.Itoa(index))
}

func (s *Array) RefString(index int) (val string) {
	root := s.root
	return convertx.AnyToString(root.source.Get(s.root.ctx, s.path+"/"+strconv.Itoa(index)))
}

func (s *Array) RefObject(index int) (r IObject) {
	iobj := s.temps[index]
	if iobj == nil {
		obj := newObject()
		obj.root = s.root
		obj.field = strconv.Itoa(index)
		obj.path = s.path + "/" + obj.field
		obj.temps = map[string]interface{}{}
		//
		creator := s.creator
		if creator != nil {
			iobj = creator(obj)
		} else {
			if obj.RefAnyType() != "" {
				creator = getType(obj.RefAnyType())
				if creator != nil {
					iobj = creator(obj)
				} else {
					iobj = obj
				}
			} else {
				iobj = obj
			}
		}

		s.temps[index] = iobj
	}

	r = iobj.(IObject)
	return
}

func (s *Array) RefLength() int {
	source := s.root.source
	return source.Length(s.path)
}
